package config

import (
	"context"
	"encoding/json"
	"sync"
	"time"

	"github.com/redis/go-redis/v9"
)

var (
	client *SimpleClient
	once   sync.Once
)

// Config 连接配置
type Config struct {
	Addr     string // 地址: host:port
	Password string // 密码
	DB       int    // 数据库编号
}

// SimpleClient Redis客户端结构体
type SimpleClient struct {
	redisClient *redis.Client
	ctx         context.Context
}

// Init 初始化Redis客户端（程序启动时调用一次）
func InitRedis() error {
	var err error
	once.Do(func() {
		redisClient := redis.NewClient(&redis.Options{
			Addr:     "localhost:6379",
			Password: "",
			DB:       0,
		})

		ctx := context.Background()
		if pingErr := redisClient.Ping(ctx).Err(); pingErr != nil {
			err = pingErr
			return
		}

		client = &SimpleClient{
			redisClient: redisClient,
			ctx:         ctx,
		}
	})
	return err
}

// Close 关闭Redis连接（程序退出时调用）
func CloseRedis() error {
	if client != nil {
		return client.redisClient.Close()
	}
	return nil
}

// Set 全局可直接调用的Set方法
func SetKey(key string, value interface{}, expire time.Duration) error {
	if client == nil {
		return redis.Nil // 或自定义错误：客户端未初始化
	}
	    // 序列化对象为JSON字符串
    data, err := json.Marshal(value)
    if err != nil {
        return err
    }
    // 存入Redis
    return client.redisClient.Set(client.ctx, key, data, expire).Err()
}

// Get 全局可直接调用的Get方法
func GetValue(key string,obj interface{})  error{
	if client == nil {
		return redis.Nil // 或自定义错误：客户端未初始化
	}
	res, err  := client.redisClient.Get(client.ctx, key).Result()
	   if err != nil {
        return err // 可能是redis.Nil（键不存在）或其他错误
    }
	 // 将JSON字符串反序列化为目标对象
    return json.Unmarshal([]byte(res), obj)
}

// Expire 全局可直接调用的Expire方法
func Expire(key string, expire time.Duration) (bool, error) {
	if client == nil {
		return false, redis.Nil // 或自定义错误：客户端未初始化
	}
	return client.redisClient.Expire(client.ctx, key, expire).Result()
}
    